// 设备树解析相关定义
// Device Tree Blob (DTB) parsing definitions

#ifndef DTB_H
#define DTB_H

#include "types.h"

// FDT头部结构
struct fdt_header {
    uint32 magic;              // 0xd00dfeed
    uint32 totalsize;          // DTB总大小
    uint32 off_dt_struct;      // 结构数据偏移
    uint32 off_dt_strings;     // 字符串数据偏移
    uint32 off_mem_rsvmap;     // 内存保留映射偏移
    uint32 version;            // DTB版本
    uint32 last_comp_version;  // 最后兼容版本
    uint32 boot_cpuid_phys;    // 引导CPU物理ID
    uint32 size_dt_strings;    // 字符串数据大小
    uint32 size_dt_struct;     // 结构数据大小
};

// FDT令牌类型
#define FDT_BEGIN_NODE  0x1
#define FDT_END_NODE    0x2
#define FDT_PROP        0x3
#define FDT_NOP         0x4
#define FDT_END         0x9

// FDT属性结构
struct fdt_prop {
    uint32 len;        // 属性值长度
    uint32 nameoff;    // 属性名在字符串表中的偏移
};

// 解析上下文
struct dtb_context {
    char *dtb_start;           // DTB起始地址
    char *struct_start;        // 结构数据起始地址
    char *strings_start;       // 字符串数据起始地址
    uint32 struct_size;        // 结构数据大小
    uint32 strings_size;       // 字符串数据大小
    uint32 current_offset;     // 当前解析偏移
};

// 设备信息结构
struct device_info {
    char name[64];             // 设备名称
    uint64 reg_base;           // 寄存器基址
    uint64 reg_size;           // 寄存器大小
    uint32 interrupt;          // 中断号
    char compatible[128];      // 兼容字符串
    int valid;                 // 是否有效
};

// 函数声明
void dtb_init(void *dtb_addr);
int dtb_parse(void);
// struct device_info *dtb_find_device(const char *compatible);
void dtb_print_devices(void);
uint32 dtb_read_u32(struct dtb_context *ctx, uint32 offset);
char *dtb_get_string(struct dtb_context *ctx, uint32 offset);

#endif // DTB_H
